package com.bnz.service.impl;

import com.bnz.entity.Dept;
import com.bnz.entity.Emp;
import com.bnz.entity.EmpVo;
import com.bnz.entity.PageResult;
import com.bnz.mapper.DeptMapper;
import com.bnz.mapper.EmpMapper;
import com.bnz.service.EmpService;
import com.bnz.util.MybatisUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class EmpServiceImpl implements EmpService {
    // 查询所有员工信息
    @Override
    public List<Emp> findAll() {
        try( SqlSession sqlSession = MybatisUtil.getSqlSession(true)) {
            // 查询所有员工
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
            List<Emp> emps = mapper.findAll();
            // 遍历员工列表，根据员工的部门编号找到所在部门，从而找到部门名称
            for (Emp emp : emps) {
                // 得到部门编号
                Integer did = emp.getDid();
                // 根据部门编号查询对应部门
                Dept dept = deptMapper.findByDid(did);
                // 给当前员工设置所在部门名称
                emp.setDname(dept.getDname());
            }
            // 返回员工列表
            return emps;
        }
    }

    // 1. 分页查询
    @Override
    public PageResult<Emp> findByPage(int page, int pageSize) {
        //2.1 开始分页
        PageHelper.startPage(page,pageSize);
        //2.2 开始查询，对所有的学生列表进行查询
        List<Emp> emps = this.findAll();
        //2.3 将学生集合转换为Page<Student>对象
        Page<Emp> empPage = (Page<Emp>) emps;
        //2.4 返回分页结果对象
        return new PageResult<>(empPage.getTotal(),empPage.getResult());
    }

    // 2. 条件查询带分页
    @Override
    public PageResult<Emp> search(int page, int pageSize, EmpVo empVo) {
        // 2.1 开始分页
        PageHelper.startPage(page,pageSize);
        // 2.2 开始查询，对所有的员工列表进行查询
        List<Emp> emps = this.findByWords(empVo);
        // 2.3 将员工集合转换为Page<Emp>对象
        Page<Emp> empPage = (Page<Emp>) emps;
        // 2.4 返回分页结果对象
        return new PageResult<>(empPage.getTotal(),empPage.getResult());
    }

    // 3. 条件查询
    @Override
    public List<Emp> findByWords(EmpVo empVo) {
        try( SqlSession sqlSession = MybatisUtil.getSqlSession(true)) {
            // 3.1 得到所有的mapper
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
            // 3.2 根据信息查询员工
            List<Emp> emps = mapper.findByWords(empVo);
            // 3.3 遍历员工列表，根据员工的部门编号找到所在部门，从而找到部门名称
            for (Emp emp : emps) {
                // 3.3.1得到部门编号
                Integer did = emp.getDid();
                // 3.3.2根据部门编号查询对应部门
                Dept dept = deptMapper.findByDid(did);
                // 3.3.3给当前员工设置所在部门名称
                emp.setDname(dept.getDname());
            }
            // 返回员工列表
            return emps;
        }
    }

    // 4. 修改员工信息
    @Override
    public void update(Emp emps) {
        try(SqlSession sqlSession = MybatisUtil.getSqlSession(true)) {
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            mapper.update(emps);
        }
    }

    // 5. 添加员工
    @Override
    public void save(Emp emps) {
        try(SqlSession sqlSession = MybatisUtil.getSqlSession(true)){
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            mapper.save(emps);
        }
    }

    // 6. 删除员工
    @Override
    public void delete(List<String> ids) {
        try(SqlSession sqlSession = MybatisUtil.getSqlSession(true)) {
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            mapper.delete(ids);
        }
    }
}
